package com.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity//开启security
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //授权规则
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /*规则：首页所有人都可以访问，功能页只有对应级别的人才能去访问。*/
        //链式编程风格
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
        /*若没有权限访问则会自动跳转到登录页面*/
       // 1.http.formLogin().loginPage("/toLogin");//开启自动登录功能./toLogin和表单action的url一致，或使用下面的方式
         //2.//这个url和表单的一致
        //http.formLogin().loginPage("/toLogin").loginProcessingUrl("/login");
        //设置表单参数
        http.formLogin().loginPage("/toLogin").usernameParameter("uname").passwordParameter("pwd").loginProcessingUrl("/login");

        /*开启注销功能！*/
//        http.logout();
        //移除所有的cookie并且清空所有的session
       //http.logout().deleteCookies("remove").invalidateHttpSession(true);
      // http.logout().logoutUrl("/");//这种方式跳转会报错
        /*防止网站被攻击，默认开启，CSRF跨站请求伪造，是一种网络攻击方式
         这也是注销失败的原因*/
        http.csrf().disable();//关闭CSRF
        http.logout().logoutSuccessUrl("/");//登出成功之后跳转的页面

        //开启记住我功能
        http.rememberMe().rememberMeParameter("remeber me");
    }

    //认证规则
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //要想我们的项目还能够正常登陆，需要修改一下configure中的代码。我们要将前端传过来的密码进行某种方式加密
        //spring security 官方推荐的是使用bcrypt加密方式。
         auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                 .withUser("刘备").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
                 .and()
                 .withUser("关羽").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
                 .and()
                 .withUser("张飞").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    }
}
